package io.gitee.wiqer.medium;

/**
 * 描述
 * 给定两个字符串str1和str2，输出两个字符串的最长公共子序列。如果最长公共子序列为空，则返回"-1"。目前给出的数据，仅仅会存在一个最长的公共子序列
 *
 * 数据范围：0 \le |str1|,|str2| \le 20000≤∣str1∣,∣str2∣≤2000
 * 要求：空间复杂度 O(n^2)O(n
 * 2
 *  ) ，时间复杂度 O(n^2)O(n
 * 2
 *  )
 */
public class SolutionNC92_LCS {
    /**
     * longest common subsequence
     * @param s1 string字符串 the string
     * @param s2 string字符串 the string
     * @return string字符串
     */
    public String LCS (String s1, String s2) {
        // write code here
        int n=s1.length();int m=s2.length();
        int [][]dp=new int[n+1][m+1];
        for(int i=1;i<=n;i++){
            for(int j=1;j<=m;j++){
                if(s1.charAt(i-1)==s2.charAt(j-1)){
                    dp[i][j]=dp[i-1][j-1]+1;
                }else{
                    dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
                }
            }
        }
        if(dp[n][m]==0)return "-1";
        StringBuilder sb=new StringBuilder();
        while(n>0&&m>0){
            if(s1.charAt(n-1)==s2.charAt(m-1)){
                sb.append(s1.charAt(n-1));
                n--;m--;
            }else{
                if(dp[n-1][m]>dp[n][m-1]){
                    n--;
                }else{
                    m--;
                }
            }
        }
        return sb.reverse().toString();
    }
}
